/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;

/**
 * Es el oyente que escucha:
 *  - MethodBeforeAdvice.before -> se ejecuta antes de invocar un método.
 *  - AfterReturningAdvice.afterReturning -> se ejecuta al salir del método sin
 *      errores en su ejecución
 *  - ThrowsAdvice no tiene método obligatorio, sino que busca uno o mas métodos
 *      llamados afterThrowing cuya firma se del tipo:
 *          public afterThrowing([method],[argumentos],[destino], throwable).
 *      Por ejemplo, para escuchar sólo NullPointerException:
 *          public afterThrowing(NullPointerException exception)...
 * @author odeen
 */
public class OyentePublico implements MethodBeforeAdvice, AfterReturningAdvice,ThrowsAdvice {
    // El publico con el que trabaja
    private Publico publico;

    public Publico getPublico() {
        return publico;
    }

    public void setPublico(Publico publico) {
        this.publico = publico;
    }



    @Override
    public void before(Method metodo, Object[] argumentos, Object destino) throws Throwable {
        publico.sentarse();
        publico.apagarMóviles();
    }

    @Override
    public void afterReturning(Object valorRetorno, Method metodo, Object[] argumentos, Object destino) throws Throwable {
        publico.aplaudir();
    }
    public void afterThrowing(Throwable error){
        publico.pedirDevolución();
    }
    
}
